// =========================
// sequelize的安装和初步使用
// =========================


// 第一步安装 npm i sequelize

// 第二部 安装npm i mysql2


 
// 连接到数据库
// const {
//     Sequelize
// } = require('sequelize');
// const sequelize = new Sequelize('node_sequelize', 'root', '1234', {
//     host: 'localhost',
//     dialect: 'mysql',
//     logging:console.log
//     /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
//     // logining:null,// 记录日志
    
// });

function test() {
    try {
        sequelize.authenticate().then(() => {
            console.log("连接成功")
        });

    } catch (err) {
        console.log(err, '连接错误')
    }
}
// test()
// 输出:
// Executing (default): SELECT 1+1 AS result
// 连接成功

// =======================
// sequelize定义模型的方法
// =======================
// const {  DataTypes } = require('sequelize');
// const { deleteAdmin } = require('../../资料/frontend-node/3-4. 模型的增删改/services/adminService');
// 先定义一个管理员的表
async function testDefineAdmin(){
    const adminObj = sequelize.define('Admin',{
        loginId:{
            type:DataTypes.STRING,
            allowNull:false
        },
        loginPwd:{
            type:DataTypes.STRING,
            allowNull:false
        },
        accoutName:{
            type:DataTypes.STRING,
            allowNull:false
        }
    })
    

    await adminObj.sync({ alter: true });

    console.log("模型同步完成")
}
// testDefineAdmin()
//testDefineAdmin 方法只是同步了一个模型
// 需要将所有的模型写好 一次性同步


// 在models中新建好所有的模型

async function buildAllConnect(){
    const {sequelize} = require('./models/sequelize')
    const admin = require('./models/Admin');
    const stu = require('./models/student');
    const grade = require('./models/Grade');
    const book = require('./models/book');
    // 定义表关系
    // A.belongsTo(B)
    stu.belongsTo(grade)
    await sequelize.sync({ alter: true  });
    console.log('所有的模型同步完毕')
    
}
buildAllConnect()

// ===================
// sequelize模型增删改
// ===================


// 根据三层架构设计
// 新建服务层和路由层

//-------------------------
// 以下代码展示如何写服务层
// 来管理一个模型
// 实际开发中要写在services中
//-------------------------



// async function addAdmin(adminObj){
//     // 需要足够考虑业务逻辑
//     // 给admin表中添加一条记录
//     const admin = require('./models/Admin');
//     const ins = admin.build(adminObj);
//     await ins.save();
//     console.log("当前用户已经保存")
// }
// addAdmin({loginId:'firstAdmin',loginPwd:'123123',name:'dudu1'})

// exports.addAdmin = async function(adminObj){
//     const ins = await Admin.create(adminObj);
//     return ins.toJSON();
// }

// exports.delAdmin = async function(id){
//     // 传入需要删除的id
//     await Admin.destroy({
//         where:{
//             id:id
//         }
//     })
// }

// exports.updateAdmin = async function (id,updateObj){
//     await Admin.update(updateObj,{
//         where:{
//             id
//         }
//     })
// }

// 使用以下的测试代码进行admin的表的增删改
// 增加一个用户
const {addAdmin,delAdmin,updateAdmin} = require("./services/adminService")

// 增加一个用户
// addAdmin({
//     loginId:'admin',
//     loginPwd:'123123',
//     name:'dudu'
// }).then((resp)=>{
//     console.log(resp)
// })

// 修改id为3的用户

// updateAdmin(3,{
//     name:'嘟嘟',
//     loginPwd:'000000'
// }).then((res)=>{
//     console.log(res)
// })

// 新增一条记录再删除

// addAdmin({
//     loginId:'admin3',
//     loginPwd:'123123',
//     name:'dudu2'
// }).then((res)=>{
//     console.log(res)
// })
// 删除
// delAdmin(4).then((res)=>{
//     console.log(res)
// })

// 按照当前的方法将所有的模型方法定义好

const {addStudent,delStudent,updateStudent} = require("./services/studentService");
function testStu(){
    //新增小红
    // addStudent({
    //   stuName:'小红',
    //   birthDay:new Date(),
    //   sex:0,
    //   phone:'13412341234',
    // })
    // addStudent({
    //     stuName:'小刚',
    //     birthDay:new Date(),
    //     sex:1,
    //     phone:'13412341234',
    //   })
    // updateStudent(2,{
    //     phone:'12312341234'
    // })
    // delStudent(3)
    
}
// testStu()

const {addGrade,delGrade,updateGrade} = require("./services/gradeService");

function testGrade(){
    // 创建3各班级
    // addGrade({
    //     className:'1班',
    //     buildDate:new Date()
    // });
    // addGrade({
    //     className:'2班',
    //     buildDate:new Date()
    // })
    // addGrade({
    //     className:'3班',
    //     buildDate:new Date()
    // })
    // updateGrade(3,{
    //     className:'三班'
    // })
    // delGrade(3)
}

// testGrade()


// const {addBook,delBook,updateBook} = require('./services/bookService');

// function testBook(){
//     addBook({
//         bookName:'始于极限',
//         publishData:new Date(),
//         author:'上野千鹤子'
//     })
//     addBook({
//         bookName:'我的天才女友',
//         publishData:new Date(),
//         author:'费兰特'
//     })
//     updateBook(2,{
//         bookName:'那不勒斯四部曲'
//     })
//     delBook(2)
// }
// testBook()


// ====================
// 模拟数据
// ====================

// 引入mock文件 用于模拟班级和学生数据
// require("./mock")

// 爬取豆瓣top书籍
// require("./utils/fetchBooks")


// 数据查询
// require("./notefor数据查询.js")

// 数据验证
require("./utils/extendValidate")
// require("./notefor数据验证");


// 访问器和虚拟字段
require("./notefor访问器和虚拟字段")

// 设置日志记录

// 尝试添加一个管理员
// const {addAdmin} = require("./services/adminService");
async function testaddAdmin(){
    await addAdmin({
        loginPwd:'123123',
        loginId:'test',
        name:'test'
    })
}
testaddAdmin()